package cn.ywang.spring.customized.framework.aop;

import java.lang.reflect.Field;
import java.lang.reflect.Proxy;

/**
 * 工具类
 *
 * @author BeatificWang
 */
public class AopProxyUtils {

	/**
	 * 被代理对象
	 *
	 * @param proxy
	 * @return
	 * @throws Exception
	 */
	public static Object getTargetObject(Object proxy) throws Exception {
		// 先判断一下，这个传递进来的对象是不是一个代理过的对象
		Object target = null;
		if (isAopProxy(proxy)) {
			target = getProxyTargetObject(proxy);
		}
		return target;
	}

	/**
	 * 获取代理对象所代理的目标对象（被代理对象）
	 *
	 * @param proxy 代理对象
	 * @return
	 * @throws Exception
	 */
	private static Object getProxyTargetObject(Object proxy) throws Exception {
		// 因为代理类proxy继承了java.lang.reflect.Proxy类，
		// 所以在Proxy类查找InvocationHandler对象
		Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
		h.setAccessible(true);
		// AopProxy实现了InvocationHandler接口
		AopProxy aopProxy = (AopProxy) h.get(proxy);
		// 获取被代理对象
		Field target = aopProxy.getClass().getDeclaredField("target");
		target.setAccessible(true);
		return target.get(aopProxy);
	}


	/**
	 * 判断是否是代理类
	 *
	 * @param object
	 * @return
	 */
	public static boolean isAopProxy(Object object) {
		return Proxy.isProxyClass(object.getClass());
	}

}
